Android 判断 WiFi 和移动数据网络(GPRS)是否同时打开

石朝辉2017-12-26 11:38AndroidAndroid WiFi GPRS

转载请注明出处,点击此处open in new window 查看更多精彩内容

判断 WiFi 是否打开

public static boolean isWiFiEnable(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext()
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivityManager == null) {
        return false;
    }
    NetworkInfo info = connectivityManager.getActiveNetworkInfo();
    return !((info == null) || (!info.isAvailable())) && info.getType() == ConnectivityManager.TYPE_WIFI;
}

判断 GPRS 是否打开

public static boolean isMobileEnable(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext()
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivityManager == null) {
        return false;
    }
    NetworkInfo info = connectivityManager.getActiveNetworkInfo();
    return !((info == null) || (!info.isAvailable())) && info.getType() == ConnectivityManager.TYPE_MOBILE;
}

判断 WiFi 与 GPRS 同开(1)

尝试: 使用 isWifiEnable()isMobileEnable() 联合判断。

public static boolean isAllEnable(Context context) {
    return isWiFiEnable(context) && isMobileEnable(context);
}

结果: 此方式无法判断 WiFiGPRS 同开。

WiFiGPRS 同时打开时系统默认使用 WiFi 网络,即networkInfo.getType() 的返回值是 TYPE_WIFI,所以isMobileEnable()的结果一定是false导致判断失败。

既然在 WiFiGPRS 同时打开时可以准确判断 WiFi 的状态,那么先使用isWifiEnable()判断 WiFi 是否打开,再想办法替代isMobileEnable()判断 GPRS 是否打开即可。

public static boolean isAllEnable(Context context) {
    if (isWiFiEnable(context)) {
        // TODO 判断移动数据网络是否打开
    } else {
        return false;
    }
}

判断 WiFi 与 GPRS 同开(2)

观察 ConnectivityManager 源码发现有这么一个函数:

ConnectivityManager#getMobileDataEnabled()

尝试使用反射调用该函数判断 WiFi 开启时 GPRS 的状态发现是可行的。

public static boolean isMobileEnableReflex(Context context) {
    try {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext()
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        Method getMobileDataEnabledMethod = ConnectivityManager.class.getDeclaredMethod("getMobileDataEnabled");
        getMobileDataEnabledMethod.setAccessible(true);
        return (Boolean) getMobileDataEnabledMethod.invoke(connectivityManager);
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

最终,可行的判断 WiFiGPRS 同开的方式如下:

public static boolean isAllEnable(Context context) {
    return isWiFiEnable(context) && isMobileEnableReflex(context);
}
最后更新于 2024-02-04 02:20:03